package br.com.mftc.efitness.basicas;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@NamedQueries({ 
	@NamedQuery(name = "UsuarioDoSistema.efetuarLogin", query = "SELECT usuario FROM UsuarioDoSistema usuario WHERE usuario.login = :LOGIN AND usuario.senha = :SENHA"),
	@NamedQuery(name = "UsuarioDoSistema.consultarPorPerfil", query = "SELECT usuario FROM UsuarioDoSistema usuario WHERE usuario.perfilDeUsuario = :PERFIL")
})

@Entity
@Table(name = "usuarios")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class UsuarioDoSistema extends ObjetoDaAcademia implements Serializable {

	private static final long serialVersionUID = -6987305237220446552L;

	@Transient
	public static final int TAMANHO_MAX_LOGIN = 30, TAMANHO_MIN_SENHA = 6, TAMANHO_MAX_SENHA = 30, TAMANHO_MAX_NOME = 230, TAMANHO_MAX_EMAIL = 230;

	@Column(length = TAMANHO_MAX_LOGIN, nullable = false, unique = true)
	private String login;

	@Column(nullable = false)
	private String senha;

	@Column(length = TAMANHO_MAX_NOME, nullable = false)
	private String nome;

	@Column(length = TAMANHO_MAX_EMAIL, nullable = false, unique = true)
	private String email;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_de_ultimo_acesso")
	private Date dataDeUltimoAcesso;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_de_alteracao_da_senha")
	private Date dataDeAlteracaoDaSenha;

	@ManyToOne
	@JoinColumn(name = "perfil", nullable = false)
	private PerfilDeUsuario perfilDeUsuario;

	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "permissoes_extras_de_usuario", joinColumns = { @JoinColumn(name = "usuario") }, inverseJoinColumns = { @JoinColumn(name = "permissao") })
	private List<Permissao> permissoesExtras;
	
	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getDataDeUltimoAcesso() {
		return dataDeUltimoAcesso;
	}

	public void setDataDeUltimoAcesso(Date dataDeUltimoAcesso) {
		this.dataDeUltimoAcesso = dataDeUltimoAcesso;
	}

	public Date getDataDeAlteracaoDaSenha() {
		return dataDeAlteracaoDaSenha;
	}

	public void setDataDeAlteracaoDaSenha(Date dataDeAlteracaoDaSenha) {
		this.dataDeAlteracaoDaSenha = dataDeAlteracaoDaSenha;
	}

	public PerfilDeUsuario getPerfilDeUsuario() {
		return perfilDeUsuario;
	}

	public void setPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) {
		this.perfilDeUsuario = perfilDeUsuario;
	}

	public List<Permissao> getPermissoesExtras() {
		return permissoesExtras;
	}

	public void setPermissoesExtras(List<Permissao> permissoesExtras) {
		this.permissoesExtras = permissoesExtras;
	}

	public Boolean possuiPermissao(Long permissao) {
		for (int index = 0; index < perfilDeUsuario.getPermissoes().size(); index++) {
			if (perfilDeUsuario.getPermissoes().get(index).getCodigo()
					.equals(permissao)) {
				return true;
			}
		}
		for (int index = 0; index < permissoesExtras.size(); index++) {
			if (permissoesExtras.get(index).getCodigo().equals(permissao)) {
				return true;
			}
		}
		return false;
	}

	public Boolean possuiPermissao(StringBuffer permissao) {
		for (int index = 0; index < perfilDeUsuario.getPermissoes().size(); index++) {
			if (perfilDeUsuario.getPermissoes().get(index).getChave()
					.equals(permissao.toString())) {
				return true;
			}
		}
		for (int index = 0; index < permissoesExtras.size(); index++) {
			if (permissoesExtras.get(index).getChave()
					.equals(permissao.toString())) {
				return true;
			}
		}
		return false;
	}
}
